import cv2
def detectAndDescribe(image):       #定义函数，检测和计算特征点
    gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    sift=cv2.SIFT_create()     #创建SIFT对象
    kp,des=sift.detectAndCompute(gray,None) #检测并计算特征点
    return image,kp,des
imgA=cv2.imread("left_01.jpg")
imgB=cv2.imread("right_01.jpg")
#调用函数，检测和计算特征点
imgA,kpA,desA=detectAndDescribe(imgA)
imgB,kpB,desB=detectAndDescribe(imgB)
index_params=dict(algorithm=1,trees=5) #定义FLANN参数
search_params=dict(checks=50)
#创建FLANN匹配器对象
flann=cv2.FlannBasedMatcher(index_params,search_params)
rawMatches=flann.knnMatch(desA,desB,k=2)    #使用KNN算法进行特征匹配
ratio=0.7
#当最近距离与次近距离的比值小于ratio时,保留此匹配对
matches=[[m]for m,n in rawMatches if m.distance<ratio*n.distance]
#绘制匹配的特征点
out=cv2.drawMatchesKnn(imgA,kpA,imgB,kpB,matches[:50],None)
#显示匹配图像
cv2.imshow('drawMatches',out)
cv2.waitKey()
cv2.destroyAllWindows()